iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
自我挑戰組

懶還要更懶,快還要更快。不可不知的小工具和知識系列 第 26

[Day26]不可不知的小工具-C#字串長度處理

  • 分享至 

  • xImage
  •  

前情提要

本篇要分享的內容會接續這兩篇(string.LengthLEN() & DATALENGTH()),如果還沒看得可以先點進去看一下。

到底該如何解決

已知

  1. SSMS預設為UTF-16
  2. NVARCHAR(500)可以儲存1002個位元組,可能少於500個字元
  3. C#中 string.Length回傳值是字元數目,而非位元組數目
  4. 對越南文使用者來說一個單詞是一個字,但對電腦而言一個字不等於一個字元,例如:Người,這是5個字元
  5. PM限制該欄位輸入內容長度不可以大於250個字

程式端

目前想到的是使用GetByteCount()去取得位元組數量,再回來寫判斷,先讓程式端和資料庫端的基準對齊。
還是要來看看微軟文件對於這個方法的解釋

在衍生類別中覆寫時,計算編碼指定的字串字元所產生的位元組數目

這個方法的意思和T-SQL的DATALENGTH()有點類似,都是回傳位元組的數目。
說明:因為SSMS預設是用UTF-16編碼,所以在下圖有先選擇用UTF-16的編碼方式(第10行)去取得位元組數目,為了就是要讓資料庫端和程式碼端的資訊對齊。如果程式碼端沒有判斷輸入字串長度,再加上依照現有的欄位大小(nvarchar(500))寫入的話,這段越南文是可以存進資料庫,但是!資料會被截斷因為位元組數還是超過了資料庫的欄位大小限制

程式碼範例
https://ithelp.ithome.com.tw/upload/images/20231009/20162714epgeSfwWU5.jpg

Output
https://ithelp.ithome.com.tw/upload/images/20231009/20162714Rb2SLRtFiZ.jpg

結論

上述解法只有先讓程式碼端和資料庫端的儲存大小判斷先一致,並沒有解決PM要的250字的限制。我覺得要解決這個問題,要先定義250字到底是什麼?是250個字母?還是250個單詞?目前大家的認知水平應該是單詞數量,如果250字是指250個單詞數量的話,那在程式碼端就不能使用string.Length > 250判斷了。在資料庫端開nvarchar(500)好像也稍嫌不足。
如果之後要再回頭改的話,我的作法可能會先請PM提供各種會塞入的越南文資料,取要塞入最大位元組數目作為欄位的大小,再去修改資料庫欄位大小和程式碼端的判斷。

參考

[C#] 計算字串的長度方式

文章同步發布於個人部落格


上一篇
[Day25]不可不知的小工具-LEN() & DATALENGTH()
下一篇
[Day27]不可不知的小工具-筆記好工具
系列文
懶還要更懶,快還要更快。不可不知的小工具和知識30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言